package cn.itsource.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 配置拦截器
 */
@Component   //交给我spring容器管理
public class LoginInterceptor implements HandlerInterceptor {

    //preHandle：此方法的作用是在请求进入到Controller进行拦截，有返回值。
    // （返回true则将请求放行进入Controller控制层，false则请求结束返回错误信息）
    //用法：登录验证（判断用户是否登录）权限验证：判断用户是否有权访问资源（校验token）
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        Object session = request.getSession().getAttribute("ADMIN_ID_SESSION");

        if (session == null) {   //判断session中是否存在数据，如果有数据就是登录过的，
            response.sendRedirect("/login");
            return false;  //拦截
        } else {
            return true;//放行 ：执行controller
        }

    }

    //postHandle：该方法是在Controller控制器执行完成但是还没有返回模板进行渲染拦截。没有返回值。
    // 就是Controller----->拦截------>ModelAndView。
    //用法：因此我们可以将Controller层返回来的参数进行一些修改，它就包含在ModelAndView中，所以该方法多了一个ModelAndView参数。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //System.out.println("进入拦截器=======执行中========");
    }

    //afterCompletion：该方法是在ModelAndView返回给前端渲染后执行。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //System.out.println("进入拦截器=======执行后========");
    }
}
